package modelo;

import java.lang.String;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;
import java.util.LinkedList;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Producto extends ConexionBD implements ProductoProducto{
    private int codigoCategoria;
    private float precio;

    public Producto(){
            super();
    }

    public boolean registrar(){
    	Vector<String> v1= new Vector<String>();
    	Vector v2= new Vector();
    	v1.add("codigo");
    	v1.add("codigoCategoria");    	
    	v1.add("descripcion");
    	v1.add("precio");
    	v1.add("estatus");
    	v2.add(getCodigo());
    	v2.add(getCodigoCategoria());
    	v2.add(getDescripcion());
    	v2.add(getPrecio());
    	v2.add(getEstatus());
        String tira=facade.generar(v1, v2, "Orden");
        
        abrirConexion();
        boolean sw = false;
        try {
             Statement stam = conexion.createStatement();
             stam.execute(tira);
             sw= true;
        } catch (SQLException ex) {
                Logger.getLogger(Producto.class.getName()).log(Level.SEVERE, null, ex);
            
             sw= false;
        }
        cerrarConexion();
        return sw;
    }
    
    public void registarIngredientes(LinkedList<Integer> codigos,LinkedList<Float> raciones){
        abrirConexion();
        for (int i = 0; i < raciones.size(); i++){
            String tira="INSERT INTO IngredientePorProducto (codigoProducto,codigoIngrediente, racion ) VALUES("+getCodigo()+","+codigos.get(i)+","+raciones.get(i)+")";
            try {
                 Statement stam = conexion.createStatement();
                stam.execute(tira);
            } catch (SQLException ex) {
                Logger.getLogger(Producto.class.getName()).log(Level.SEVERE, null, ex);
            }
        }        
        cerrarConexion();
    }


   public LinkedList<Producto> consultarGeneral(){
    LinkedList<Producto> v = new LinkedList<Producto>();
    String tira="SELECT * FROM Producto WHERE estatus='A'";
    abrirConexion();
    try {
        Statement stam = conexion.createStatement();
        ResultSet rs =        stam.executeQuery(tira);
        
        while (rs.next()){
            Producto  i = new Producto();
            i.setDescripcion(rs.getString("descripcion"));
            i.setCodigo(rs.getInt("codigo"));
            i.setPrecio(rs.getFloat("precio"));
            i.setEstatus(rs.getString("estatus"));
            i.setCodigoCategoria(rs.getInt("codigoCategoria"));
            v.add(i);
         }
    } catch (SQLException ex) {
        Logger.getLogger(Producto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }
  

 

public LinkedList<String []> listarVentas(boolean asc, boolean desc){
    LinkedList<String []> v = new LinkedList<String []>();
    String tira="SELECT descripcion, (precio*total.raciones), total.raciones, codigo FROM  Producto, (SELECT sum(IngredientePorProducto.racion) as raciones, IngredientePorProducto.codigoProducto AS cod FROM IngredientePorProducto  GROUP BY IngredientePorProducto.codigoProducto) total WHERE total.cod=codigo AND estatus='A' ORDER BY(total.raciones,(precio*total.raciones)) ";
    if(asc)
        tira+= "ASC";
    if(desc)
        tira+= "DESC";
    abrirConexion();
    try{
        Statement stam = conexion.createStatement();
        ResultSet rs = stam.executeQuery(tira);
        while (rs.next()){
            String [] s = {rs.getString(1), ""+rs.getFloat(2), ""+rs.getInt(3),rs.getString(4)};
            v.add(s);
        }
    } catch (SQLException ex) {
        Logger.getLogger(Producto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

   public boolean revisarDisponibilidadStockIngredientes(){
    LinkedList<Ingrediente> v = new LinkedList<Ingrediente>();
    LinkedList<Float> f = new LinkedList<Float>();
    String tira="SELECT Ingrediente.codigo,IngredientePorProducto.racion FROM  Ingrediente,IngredientePorProducto,Producto WHERE Ingrediente.estatus='A'  AND Producto.estatus='A' AND Producto.codigo=IngredientePorProducto.codigoProducto AND Producto.codigo="+getCodigo();
    abrirConexion();
    try{
        Statement stam = conexion.createStatement();
        ResultSet rs = stam.executeQuery(tira);        
        while(rs.next()){
            Ingrediente  i = new Ingrediente();
            i.setCodigo(rs.getInt(1));
            f.add(rs.getFloat(2));
            v.add(i);
         }
     } catch (SQLException ex) {
            Logger.getLogger(Ingrediente.class.getName()).log(Level.SEVERE, null, ex);
     }
     cerrarConexion();
     int i = 0;
     for (Ingrediente m : v) {
         if(m.revisarDisponibilidadStock(f.get(i)))
             return false;
         i++;
     }
     return true;
  }

   public void restarStockIngredientes(){
    LinkedList<Ingrediente> v = new LinkedList<Ingrediente>();
    LinkedList<Float> f = new LinkedList<Float>();
    String tira="SELECT Ingrediente.codigo,IngredientePorProducto.racion FROM  Ingrediente,IngredientePorProducto,Producto WHERE Ingrediente.estatus='A'  AND Producto.estatus='A' AND Producto.codigo=IngredientePorProducto.codigoProducto AND Producto.codigo="+getCodigo();
    abrirConexion();
    try{
        Statement stam = conexion.createStatement();
        ResultSet rs = stam.executeQuery(tira);
        while(rs.next()){
            Ingrediente  i = new Ingrediente();
            i.setCodigo(rs.getInt(1));
            f.add(rs.getFloat(2));
            v.add(i);
         }
     } catch (SQLException ex) {
            Logger.getLogger(Ingrediente.class.getName()).log(Level.SEVERE, null, ex);
     }
     cerrarConexion();
     int i = 0;
     for (Ingrediente m : v) {
         m.consultar();
         m.setStock(m.getStock()-f.get(i));
         m.restarStock();
         i++;
     }
  }   


    public float getPrecio() {
        return precio;
    }

    public void setPrecio(float precio) {
        this.precio = precio;
    }

    public int getCodigoCategoria() {
        return codigoCategoria;
    }

    public void setCodigoCategoria(int codigoCategoria) {
        this.codigoCategoria = codigoCategoria;
    }

    

    

    



}
